package es.javamyadmin.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import es.javamyadmin.modelo.Tables;

public class TablesDAO {
	
	Connection conexion = null;
	Statement estamento = null;
	PreparedStatement preparada = null;
	ResultSet resultado = null;
	
	
	/*METODO PARA LEER BASES DE DATOS*/
	public Collection<Tables> leerTables(String user, String pass, String host, String port, String database){
		Collection<Tables> lista = new ArrayList<Tables>();
		try {
			Class.forName("com.mysql.jdbc.Driver");
      	    conexion=DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/"+database, user, pass);
      	    
      	    PreparedStatement pstm = conexion.prepareStatement("SHOW TABLE STATUS");
      	    resultado = pstm.executeQuery();
			while(resultado.next()){
				Tables table = new Tables();
				table.setNombreTable(resultado.getString(1));
				table.setNumFilas(resultado.getString(5));
				table.setCotejamiento(resultado.getString(15));
				table.setTipo(resultado.getString(2));
				lista.add(table);				
			}
		} catch(SQLException | ClassNotFoundException ex){
			ex.printStackTrace();
		} finally {
			cerrarConexion();
		}
		
		return lista;		
	}
	
	/*METODO PARA LEER NÚMERO DE FILAS DE UNA TABLA*/
	public Collection<Tables> leerNumFilasTables(String user, String pass, String host, String port, String database, String table){
		Collection<Tables> lista = new ArrayList<Tables>();
		try {
			Class.forName("com.mysql.jdbc.Driver");
      	    conexion=DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/"+database, user, pass);
      	    
      	    PreparedStatement pstm = conexion.prepareStatement("SELECT COUNT(*) \"count\" FROM "+table);
      	    resultado = pstm.executeQuery();
			while(resultado.next()){
				Tables miTable = new Tables();
				miTable.setNumFilas(resultado.getString(1));
				lista.add(miTable);				
			}
		} catch(SQLException | ClassNotFoundException ex){
			ex.printStackTrace();
		} finally {
			cerrarConexion();
		}
		
		return lista;		
	}
	
	public Collection<Tables> detalleTables(String user, String pass, String host, String port, String database, String tabla){
		Collection<Tables> lista = new ArrayList<Tables>();
		try {
			Class.forName("com.mysql.jdbc.Driver");
      	    conexion=DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/"+database, user, pass);
      	    
      	    PreparedStatement pstm = conexion.prepareStatement("describe " + tabla);
      	    resultado = pstm.executeQuery();
			while(resultado.next()){
				Tables table = new Tables();
				table.setNombreColum(resultado.getString(1));
				table.setTipoColum(resultado.getString(2));
				table.setNullColum(resultado.getString(3));
				table.setKeyColum(resultado.getString(4));
				table.setDefaultColum(resultado.getString(5));
				table.setExtraColum(resultado.getString(6));
				lista.add(table);
			}
		} catch(SQLException | ClassNotFoundException ex){
			ex.printStackTrace();
		} finally {
			cerrarConexion();
		}
		
		return lista;		
	}
	
	public Collection<Tables> selecTables(String user, String pass, String host, String port, String database, String tabla){
		Collection<Tables> listaDeListas = new ArrayList<Tables>();
		try {
      	    Iterator a = detalleTables(user, pass, host, port, database, tabla).iterator();
      	    Collection<Tables> lista = new ArrayList<Tables>();
      	    while(a.hasNext()){
      	    	Tables tablas =  (Tables) a.next();
      	    	tablas.setContenido(tablas.getNombreColum().toUpperCase());
      	    	lista.add(tablas);
      	    }
      	    Tables list = new Tables();
      	    list.setSelect(lista);
      	    listaDeListas.add(list);
      	    Class.forName("com.mysql.jdbc.Driver");
    	    conexion=DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/"+database, user, pass);
      	    PreparedStatement pstm = conexion.prepareStatement("select * from " + tabla);
      	    resultado = pstm.executeQuery();
      	    int numeroColumnas;
			while(resultado.next()){
				numeroColumnas = resultado.getMetaData().getColumnCount();
				Collection<Tables> listaDatos = new ArrayList<Tables>();
				Tables listaSelect = new Tables();
				for(int i = 1; i <= numeroColumnas; i++){
					Tables tab = new Tables();
					tab.setContenido(resultado.getString(i));
					listaDatos.add(tab);
				}
				listaSelect.setSelect(listaDatos);
				listaDeListas.add(listaSelect);
			}
		} catch(SQLException | ClassNotFoundException ex){
			ex.printStackTrace();
		} finally {
			cerrarConexion();
		}
		
		return listaDeListas;		
	}
	
	public boolean updateCampo(String user, String pass, String host, String port, String database, String tabla, String valor, int col, int fil){
		int contador = 0;
		boolean error = false;
		String campoModificar = "";
		try {
			Collection<Tables> lista2 = detalleTables(user, pass, host, port, database, tabla);
      	    Iterator a = lista2.iterator();
      	    String condicion[] = new String[lista2.size()];
      	    Collection<Tables> lista = new ArrayList<Tables>();
      	    while(a.hasNext()){
      	    	Tables tablas =  (Tables) a.next();
	      	    condicion[contador] = tablas.getNombreColum();
	      	    contador++;
      	    }
      	    System.out.println("Columna=" + col + ", Fila="+fil);
      	    Tables list = new Tables();
      	    list.setSelect(lista);
      	    Class.forName("com.mysql.jdbc.Driver");
    	    conexion=DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/"+database, user, pass);
      	    PreparedStatement pstm = conexion.prepareStatement("select * from " + tabla);
      	    resultado = pstm.executeQuery();
      	    int numeroColumnas;
      	    contador = 0;
      	    String where = "where ";
			while(resultado.next()){
				numeroColumnas = resultado.getMetaData().getColumnCount();
				if(contador+1 == fil){
					contador = 0;
					for(int i = 1; i <= numeroColumnas; i++){
						if(i != col){
							where = where + condicion[contador] + "='" + resultado.getString(i) + "' and ";
						}
						else{
							campoModificar = condicion[contador];
						}
						contador++;
					}
				break;
				}
				contador++;
			}
			where = where.substring(0,where.length()-4);
			error = update(user, pass, host, port, database, tabla, valor, where, campoModificar);
		} catch(SQLException | ClassNotFoundException ex){
			error = true;
			//ex.printStackTrace();
		} finally {
			cerrarConexion();
		}
		
		return error;
	}
	
	public boolean update(String user, String pass, String host, String port, String database, String tabla, String valor, String where, String campoModificar){
		boolean error = false;
		try {
      	    Class.forName("com.mysql.jdbc.Driver");
    	    conexion=DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/"+database, user, pass);
      	    PreparedStatement pstm = conexion.prepareStatement("update " + tabla + " set " + campoModificar + "='" + valor + "' " + where);
      	    System.out.println("update " + tabla + " set " + campoModificar + "='" + valor + "' " + where);
      	    int i = pstm.executeUpdate();
      	  	System.out.println("devolucion update ->"+i);
      	    if(i!=1){
      	    	error = true;
      	    }
		} catch(SQLException | ClassNotFoundException ex){
			error = true;
			ex.printStackTrace();
		} finally {
			cerrarConexion();
		}
		return error;
	}
	public void cerrarConexion(){
		if(resultado != null){
			try {
				resultado.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			resultado = null;
		}
		if(estamento != null){
			try {
				estamento.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			estamento = null;
		}
		if(preparada != null){
			try {
				preparada.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			preparada = null;
		}
		if(conexion != null){
			try {
				conexion.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			conexion = null;
		}
	}
}
